package maquina.modelo.elector;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.Hashtable;
import java.util.Observable;
import java.util.Vector;

public class ModeloElector extends Observable {

	private static String PRESIDENTES = "presidentes.txt";
	private static String GOBERNADORES = "gobernadores.txt";	
	
	private Hashtable<Integer, Vector<Candidato>> candidatos;
	private int page = 1, categoriaActual, cantCategorias;// a 1 presidentes, a
															// 2 gobernadores
	private Vector<Integer> candidatosSeleccionados;
	private Vector<Candidato> candidatosConfirmados;
	
	private int MIN_CANDIDATOS = 0;
	private boolean enVotacion = false, candidatosCargados = false;

	
	public static class ModeloElectorException extends Exception{
		
		public ModeloElectorException(Exception e){
			
			super(e);
		}
	}
	
	public ModeloElector() throws ModeloElectorException{

		this.cantCategorias = 0;
		candidatos = new Hashtable<Integer, Vector<Candidato>>();
		
		candidatosSeleccionados = new Vector<Integer>();
		
		candidatosConfirmados = new Vector<Candidato>();

		if (!candidatosCargados) {
			int key = 1;
			try {
				// Leer archivo
				FileReader fr = new FileReader(PRESIDENTES);
				BufferedReader entrada = new BufferedReader(fr);
				String s;
				Integer i = 1;
				Vector temp = new Vector();
				while ((s = entrada.readLine()) != null) {
					System.out.print(s);
					String nombre = new String(s);
					s = entrada.readLine();
					String boleta = new String(s);
					Candidato aux;

					aux = new Candidato(nombre, i, boleta);// esta es la
															// variable donde
															// queda instanciada

					temp.add(aux);
					i++;
				}

				this.candidatos.put(key, temp);
				key++;
				this.cantCategorias++;
			} catch (Exception ex) {
				
				throw new ModeloElectorException(ex);
			}

			try {
				FileReader fr2 = new FileReader(GOBERNADORES);
				BufferedReader entrada2 = new BufferedReader(fr2);
				String s2;
				Integer i2 = 1;
				Vector temp = new Vector();
				while ((s2 = entrada2.readLine()) != null) {
					System.out.println(s2);
					Candidato aux2;

					aux2 = new Candidato(s2, i2, "D:/02.jpg");// esta																			// es
																			// la
																			// variable
																			// donde
																			// queda
																			// instanciada

					temp.add(aux2);
					i2++;
				}
				this.candidatos.put(key, temp);
				key++;
				this.cantCategorias++;
			} catch (Exception ex) {
				
				throw new ModeloElectorException(ex);
			}

			candidatosCargados = true;
			categoriaActual = this.candidatos.size();
            System.out.print("ddddd");
			this.setChanged();
			notifyObservers(this.candidatos);
			
			page++;

		}
	}

	public Hashtable getCandidatos(){
		return this.candidatos;
	}
	
	public void nuevaEleccion() {
		if ((candidatosCargados) && (!enVotacion)) {
			enVotacion = true;
			candidatosSeleccionados.removeAllElements();
			candidatosConfirmados.removeAllElements();
			categoriaActual = this.candidatos.size();
		}
	}

	

	public void cambiarEstadoCandidato(Integer idCandidato) {
		if ((enVotacion) && (candidatosCargados)) {
			if ((idCandidato > MIN_CANDIDATOS)
					&& (idCandidato <= ((this.candidatos)
							.get(this.categoriaActual)).size())) {
				idCandidato--;

				if (!candidatosSeleccionados.contains(idCandidato))// selecciona
																	// un nuevo
																	// candidato
				{
					if (candidatosSeleccionados.size() < 1)// si 2 es el maximo
															// de candidatos que
															// se pueden elejir
					{
						candidatosSeleccionados.add(idCandidato);
						this.setChanged();

						notifyObservers(idCandidato);
					}
				} else// des-selecciona un candidato
				{
					candidatosSeleccionados.remove(idCandidato);
					this.setChanged();
					notifyObservers(idCandidato);
				}

			}
		}
	}

	public Vector<Candidato> confirmarEleccion() {
		
		Vector<Candidato> copiaCandidatos = null;
		
		if ((enVotacion) && (candidatosCargados)) {
			
			if (candidatosSeleccionados.size() == 1){// selecciono un candidato y lo confirma
				
				
				
				int candidatoConfirmado = candidatosSeleccionados.get(0);
				
				candidatosConfirmados.add(candidatos.get(categoriaActual).get(candidatoConfirmado));
				
				categoriaActual--;
				
				candidatosSeleccionados.removeAllElements();
				
				this.setChanged();
				
				if (candidatosConfirmados.size() == this.cantCategorias) {
					
					categoriaActual = this.candidatos.size();
					
					copiaCandidatos = new Vector<Candidato>();
					
					for(Candidato candidato : candidatosConfirmados){
						
						copiaCandidatos.add(candidato);
					}
					
					candidatosConfirmados.removeAllElements();
					
					notifyObservers(new String("CIERRE VOTACION"));
					
					enVotacion = false;

				} else
					notifyObservers();

			}
		}
		return copiaCandidatos;
	}

}
